博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SOAP协议 访问Webservice
阅读量:6442 次
发布时间:2019-06-23

本文共 10972 字,大约阅读时间需要 36 分钟。

hot3.png

已整理成完整项目,并进行了优化。看参考地址:

SOAP的作用:      

      客户端:取得服务端的服务描述文件WSDL,解析该文件的内容,了解服务端的服务信息,以及调用方式。根据需要,生成恰当的SOAP请求消息(指定调用的方法,已经调用的参数),发往服务端。等待服务端返回的SOAP回应消息,解析得到返回值。

       服务端:生成服务描述文件,以供客户端获取。接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。根据WSDL和WSML的描述,调用相应的COM对象来完成指定功能,并把返回值放入SOAP回应消息返回给用户。

下面以“天气预报”为例 (http://www.webxml.com.cn/WebServices/WeatherWebService.asmx ),自己封装几个类,做一个接口访问。

封装SOAP访问参数的实体类:SoapParam.java

 

package andy.demo.tests; /** *  * @文件名 :SoapParam.java
* @类描述 :调用 webservice的配置类
* @作者 :Andy.wang
* @创建时间 :2013-11-7下午2:45:36
* @更改人 :
* @更改时间 :
*/public class SoapParam { /** * 多个参数名或多个参数值,之间的分隔符 */ public static final String SPLITFLAG = "!"; /** * 空构造,属性初始化 */ public SoapParam() { // TODO Auto-generated constructor stub super(); this.url = ""; this.methodName = ""; this.interfaceName = ""; this.paraNames = ""; this.paraValues = ""; } /** * 构造,属性赋值 * * @param url * @param methodName * @param interfaceName * @param paraNames * @param paraValues */ public SoapParam(String url, String methodName, String interfaceName, String paraNames, String paraValues) { this.url = url; this.methodName = methodName; this.interfaceName = interfaceName; this.paraNames = paraNames; this.paraValues = paraValues; } /** * webservice 发布的URL地址 */ private String url; /** * 要调用的方法名 */ private String methodName; /** * 要调用方法的接口名 */ private String interfaceName; /** * 要调用方法的参数名,(有多个参数用”#“号隔开;没有参数可不写)。 */ private String paraNames; /** * 要调用方法的参数值,(同多个参数值用”#“号隔开;没有的话就不写)必须与参数名的个数一致。 */ private String paraValues; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getInterfaceName() { return interfaceName; } public void setInterfaceName(String interfaceName) { this.interfaceName = interfaceName; } public String getParaNames() { return paraNames; } public void setParaNames(String paraNames) { this.paraNames = paraNames; } public String getParaValues() { return paraValues; } public void setParaValues(String paraValues) { this.paraValues = paraValues; } }

获取WebService 返回结果的类:GetResult.java (提供两种结果,一种为字符串,一种为InputStream流)

 

package andy.demo.tests; import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection; /** *  * @文件名 :GetResult.java
* @类描述 :获取服务器端返回的结果
* @作者 :Andy.wang
* @创建时间 :2013-11-7下午3:00:46
* @更改人 :
* @更改时间 :
*/public class GetResult { // SoapRequeatContent 的 错误返回码 private final String faultCode = "-1"; private SoapParam soapParam; /** * 构造,给属性soapParam赋值 * * @param soapParam */ public GetResult(SoapParam soapParam) { // TODO Auto-generated constructor stub this.soapParam = soapParam; } /** * * 方法名 :getSoapRequestContent
* 方法描述 :获取请求的Soap内容
* 创建者 :Andy.wang
* 创建时间 :2013-11-7下午3:03:41
* * @return 返回类型 :String */ private String getSoapRequestContent() { StringBuffer sb = new StringBuffer(16); // 头部分 sb.append("
" + "
" + "
"); // 中间部分 String methodName = soapParam.getMethodName(); String interfaceName = soapParam.getInterfaceName(); String paraNames = soapParam.getParaNames(); String paraValues = soapParam.getParaValues(); if (null == methodName || "".equals(methodName) || null == interfaceName || "".equals(interfaceName)) { return faultCode; } sb.append("<" + methodName.trim() + " xmlns=\"" + interfaceName.trim() + "\">"); if (null != paraNames && null != paraValues) { String names[] = paraNames.split(SoapParam.SPLITFLAG); String values[] = paraValues.split(SoapParam.SPLITFLAG); // 参数名的个数 必须和 实参的个数一致 if (names.length == values.length) { for (int i = 0; i < names.length; i++) { if (!names
.trim().equals("")) { // 参数为:1级数组 sb.append("<" + names.trim() + ">" + values.trim() + "
.trim() + ">"); } } } } sb.append("
"); // 尾部分 sb.append("
"); return sb.toString(); } public InputStream getResponseForInputStream() { String soap = getSoapRequestContent(); return getResponseForInputStream(soap); } public String getResponseForString() { String soap = getSoapRequestContent(); return getResponseForString(soap); } /** * * 方法名 :getResponseForInputStream
* 方法描述 :获取服务器响应返回的流
* 创建者 :Andy.wang
* 创建时间 :2013-11-7下午3:31:39
* * @return 返回类型 :InputStream */ private InputStream getResponseForInputStream(String soap) { System.out.println(soap); // 获取请求的soap内容错误 if (soap.equals(faultCode)) { return null; } URL url = null; InputStream is = null; try { url = new URL(soapParam.getUrl()); URLConnection conn = url.openConnection(); conn.setUseCaches(false);// POST请求 禁用缓存 conn.setReadTimeout(6000);// 设置请求时间 conn.setDoInput(true);// 设置从conn读入 conn.setDoOutput(true);// 设置从conn输出 conn.setRequestProperty("Content-Length", Integer.toString(soap.length())); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); conn.setRequestProperty( "SOAPAction", String.valueOf(soapParam.getInterfaceName() + soapParam.getMethodName())); OutputStream os = conn.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8"); osw.write(soap); osw.flush(); osw.close(); is = conn.getInputStream(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return is; } /** * * 方法名 :getResponseForString
* 方法描述 :获取服务器响应返回的字符串
* 创建者 :Andy.wang
* 创建时间 :2013-11-7下午3:57:19
* * @param is * :服务器响应返回的流 * @return * @throws IOException * 返回类型 :String */ private String getResponseForString(String soap) { try { InputStream is = getResponseForInputStream(soap); if (null == is) { return null; } ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] buffer = new byte[1024 * 100]; int len = 0; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } buffer = os.toByteArray(); os.flush(); os.close(); is.close(); return os.toString("UTF-8"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } }

测试类:Test.java

输出结果:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><getSupportProvince xmlns="http://WebXml.com.cn/"></getSupportProvince></soap:Body></soap:Envelope>

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getSupportProvinceResponse xmlns="http://WebXml.com.cn/"><getSupportProvinceResult>< string>直辖市</string><string>特别行政区< /string><string>黑龙江</string><string>吉林< /string><string>辽宁</string><string>内蒙古< /string><string>河北</string><string>河南< /string><string>山东</string><string>山西< /string><string>江苏</string><string>安徽< /string><string>陕西</string><string>宁夏< /string><string>甘肃</string><string>青海< /string><string>湖北</string><string>湖南< /string><string>浙江</string><string>江西< /string><string>福建</string><string>贵州< /string><string>四川</string><string>广东< /string><string>广西</string><string>云南< /string><string>海南</string><string>新疆< /string><string>西藏</string><string>台湾< /string><string>亚洲</string><string>欧洲< /string><string>非洲</string><string>北美洲< /string><string>南美洲</string><string>大洋洲< /string></getSupportProvinceResult></getSupportProvinceResponse></soap:Body></soap:Envelope>

已整理成完整项目,并进行了优化。看参考地址:

转载于:https://my.oschina.net/andy1989/blog/215447

你可能感兴趣的文章
HTML5 web workers
查看>>
unity3D小小白之刚体(rigidbody)碰撞体(colliders)的简单使用方法
查看>>
为什么需要虚析构函数
查看>>
问题-应用程序加载图标不可用
查看>>
Objective-C 中nil/Nil/NULL/NSNull
查看>>
细聊分布式ID生成方法
查看>>
脸上有酒窝,脖子后有痣,胸前有颗痣,此三种人不能错过
查看>>
用VC++开发Oracle数据库应用程序详解2
查看>>
bzoj1305
查看>>
SpringAOP面向切面编程
查看>>
[USACO12JAN]Video Game Combos
查看>>
Multiset的使用 TOJ 2196.Nuanran's Idol II 与 UVA11136 Hoax or what
查看>>
Linux安装相关
查看>>
WIN7 下 在cmd 命令中 进入某个目录 的方法
查看>>
查看被锁的表和解锁
查看>>
canvas自适应圆形时钟绘制
查看>>
币值转换编程总结
查看>>
javascript中关于value的一个小知识点(value既是属性也是变量)
查看>>
cookie创建,使用 . session与Cookie区别
查看>>
截取字符串 substring substr slice
查看>>